package cn.kent.high.juc.atomic;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.LongAdder;

/**
 * 高并发下多个线程竞争更新同一个原子变量，然而每次只会有一条线程可以执行成功，这会白白浪费CPU资源
 * LongAdder就是为了弥补AtomicLong的这个缺点
 * 思路：把一个变量分成多个变量，让多个线程去竞争多个变量，岂不提高了效率？
 *
 * LongAdder其实是{@link java.util.concurrent.atomic.LongAccumulator}的一个特例
 */
public class LongAdderTest {
    public static void main(String[] args) {
        // LongAdder longAdder = new LongAdder();
        // longAdder.add(1);
        // long l = longAdder.longValue();
        // System.out.println(l);

        AtomicInteger atomic = new AtomicInteger();
        // atomic.addAndGet(1);
        int probe = atomic.addAndGet(0x9e3779b9);
        probe ^= probe << 13;   // xorshift
        probe ^= probe >>> 17;
        probe ^= probe << 5;
        System.out.println(probe);
        // int转二进制
        System.out.println(Integer.toBinaryString(8));
        // int probe = (p == 0) ? 1 : p; // skip 0
        // long seed = mix64(seeder.getAndAdd(SEEDER_INCREMENT));

        // 位运算符 同位两者为1，返回1
        // // 0011 1100 & 0000 1101
        // System.out.println(60 & 13);
    }
}
